﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using produccion.clases;
using produccion.AccesoDatos;
using System.Collections.ObjectModel;
using System.Windows.Media.Imaging;
using System.Windows.Input;
using System.Windows.Controls;
using System.Windows;
using System.ComponentModel;
using System.Data;

namespace produccion.vistamodelo
{
    public class VMcolecciones:ViewModelBase
    {

        #region constructor
        
        public VMcolecciones()
        {
            try
            {
                consultarColecciones();             
                buscarReferencia = new VMbuscarReferencia();
                buscarReferencia.TieneColor = true;
                buscarReferencia.PropertyChanged+= OnBuscarReferenciaPropertyChanged;

                if (MDOgeneral.conexion == null || MDOgeneral.conexion.State == ConnectionState.Closed)
                {
                    MDOgeneral.conectar();
                }
                strTituloVentana = "Colecciones" + " - Usuario:" + MDOgeneral.usuario + " - [FRMcolecciones]";
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        #endregion

        #region fields

        private CLSMAECLCP _coleccion = new CLSMAECLCP();
        private ProcesoProduccionRepositorio _rep = new ProcesoProduccionRepositorio();

        #endregion
        
        #region public interface

        public string codigo 
        {
            get { return _coleccion.CODCLC_CLC; }
            set 
            { 
                _coleccion.CODCLC_CLC = value;
                consultarColeccion();
                visorFotoReferencia.strCodigo = "";
                base.OnPropertyChanged("codigo");
            }
        }

        public string nombre
        {
            get { return _coleccion.NOMCLC_CLC; }
            set { _coleccion.NOMCLC_CLC = value; base.OnPropertyChanged("nombre"); }
        }

        public string descripcion
        {
            get { return _coleccion.DETALLE_CLC; }
            set { _coleccion.DETALLE_CLC = value; base.OnPropertyChanged("descripcion"); }
        }

        private string _strTituloVentana;
        public string strTituloVentana
        {
            get { return _strTituloVentana; }
            set { _strTituloVentana = value; base.OnPropertyChanged("strTituloVentana"); }
        }
        private List<CLSMAECLCP> _lisColecciones;
        public List<CLSMAECLCP> lisColecciones 
        {
            get { return _lisColecciones; }
            set { _lisColecciones = value; base.OnPropertyChanged("lisColecciones"); }
        }

        private MDOgeneral.mensaje _msn = new MDOgeneral.mensaje();
        public MDOgeneral.mensaje msn 
        {
            get { return  _msn;  }
            set { _msn = value; base.OnPropertyChanged("msn"); }
        }

        private CLSMAECLCP _selColeccion = new CLSMAECLCP();
        public CLSMAECLCP selColeccion
        {
            get { return _selColeccion; }
            set
            {
                _selColeccion = value;
                if (_selColeccion != null)
                    codigo = _selColeccion.CODCLC_CLC;
                base.OnPropertyChanged("selColeccion");
            }
        }

        private ObservableCollection<VMreferenciaColeccion> _lisReferencias = new ObservableCollection<VMreferenciaColeccion>();
        public ObservableCollection<VMreferenciaColeccion> lisReferencias {
            get { return _lisReferencias; }
            set { _lisReferencias = value; base.OnPropertyChanged("lisReferencias"); }
        }

        RelayCommand _cmdEliminar;
        public ICommand cmdEliminar
        {
            get
            {
                if (_cmdEliminar == null)
                {
                    _cmdEliminar = new RelayCommand(r => Eliminar());
                }
                return _cmdEliminar;
            }
        }

        RelayCommand _cmdAgregar;
        public ICommand cmdAgregar
        {
            get
            {
                if (_cmdAgregar == null)
                {
                    _cmdAgregar = new RelayCommand(Agregar);
                }
                return _cmdAgregar;
            }
        }

        RelayCommand _cmdBuscarReferencia;
        public ICommand cmdBuscarReferencia
        {
            get
            {
                if (_cmdBuscarReferencia == null)
                {
                    _cmdBuscarReferencia = new RelayCommand(x=>BuscarReferencia());
                }
                return _cmdBuscarReferencia;
            }
        }

        RelayCommand _cmdBuscarColeccion;
        public ICommand cmdBuscarColeccion 
        {
            get
            {
                if (_cmdBuscarColeccion  == null)
                {
                    _cmdBuscarColeccion = new RelayCommand(x => BuscarColeccion());
                }
                return _cmdBuscarColeccion ;
            }
        }

        RelayCommand _cmdGuardarCambios;
        public ICommand cmdGuardarCambios
        {
            get
            {
                if (_cmdGuardarCambios == null)
                {
                    _cmdGuardarCambios = new RelayCommand(r => GuardarCambios());
                }
                return _cmdGuardarCambios;
            }
        }

        RelayCommand _cmdEliminarColeccion;
        public ICommand cmdEliminarColeccion
        {
            get
            {
                if (_cmdEliminarColeccion == null)
                {
                    _cmdEliminarColeccion = new RelayCommand(r => EliminarColeccion());
                }
                return _cmdEliminarColeccion;
            }
        }

        RelayCommand _cmdSalir;
        public ICommand cmdSalir
        {
            get
            {
                if (_cmdSalir == null)
                {
                    _cmdSalir = new RelayCommand(Salir);
                }
                return _cmdSalir;
            }
        }

      
        private VMreferenciaColeccion _selReferencia;
        public VMreferenciaColeccion selReferencia 
        {
            get { return _selReferencia; }
            set 
            { 
                _selReferencia = value;
                if (_selReferencia != null)
                {
                    if (_selReferencia.referencia != null)
                    {
                        visorFotoReferencia.strCodigo = _selReferencia.referencia;
                        visorFotoReferencia.strColor = _selReferencia.codColor;
                    }
                }
                base.OnPropertyChanged("selReferencia");
            }
        }

        private VMbuscarReferencia _buscarReferencia;
        public VMbuscarReferencia buscarReferencia
        {
            get { return _buscarReferencia; }
            set { _buscarReferencia = value; base.OnPropertyChanged("buscarReferencia"); }
        }

        private VMvisorFotoReferencia _visorFotoReferencia = new VMvisorFotoReferencia();
        public VMvisorFotoReferencia visorFotoReferencia
        {
            get { return _visorFotoReferencia; }
            set { _visorFotoReferencia = value; base.OnPropertyChanged("visorFotoReferencia"); }
        }

        private VMbuscarGeneral _buscarGeneral;
        public VMbuscarGeneral buscarGeneral 
        {
            get { return _buscarGeneral; }
            set { _buscarGeneral = value; base.OnPropertyChanged("buscarGeneral"); }        
        }

        #endregion

        #region methods

        public void consultarColeccion() 
        {
            try 
            {
                _coleccion.Consultar();
                consultarReferenciasColeccion();
                base.OnPropertyChanged("nombre");
                base.OnPropertyChanged("descripcion");
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }        
        }

        public void consultarColecciones() 
        {
             try 
             {
                 lisColecciones=_coleccion.listColecciones();
                 buscarGeneral = new VMbuscarGeneral((from cust in lisColecciones select new VMlistaGenerica { 
                 strColumna1=cust.CODCLC_CLC,
                 strColumna2=cust.NOMCLC_CLC,
                 strColumna3=cust.DETALLE_CLC
                 }).ToList());
                 buscarGeneral.PropertyChanged += OnBuscarGeneralPropertyChanged;
                 buscarGeneral.gridBuscar.columna1.strNombre = "Código";
                 buscarGeneral.gridBuscar.columna2.strNombre = "Nombre";
                 buscarGeneral.gridBuscar.columna3.strNombre = "Detalle";
                 buscarGeneral.gridBuscar.strTitulo = " Buscar Colección";
             }catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }  
        }

        public void consultarReferenciasColeccion() 
        {
            try 
            {
                List<CLSREFCLCP> lista= _rep.consultarReferenciasColeccion(_coleccion);
                List<VMreferenciaColeccion> all = (from cust in lista select new VMreferenciaColeccion(cust)).ToList();
                lisReferencias = new ObservableCollection<VMreferenciaColeccion>(all);
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false; }
        }

        public void BuscarColeccion() 
        {
            try 
            {
                buscarGeneral.IsOpen = true;
            }
            catch (Exception ex) { throw ex; }
        }

        void OnBuscarGeneralPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            if (e.PropertyName == "IsOpen")
            {
                if (!buscarGeneral.IsOpen) {
                    if (buscarGeneral.gridBuscar.selLista != null)
                    {
                        codigo = buscarGeneral.gridBuscar.selLista.strColumna1;
                    }
                }
            }
               
        }

        public void Eliminar() 
        {
            try 
            {

                if (selReferencia != null)
                {
                    if (selReferencia.agregar)
                    {
                        lisReferencias.Remove(selReferencia);
                    }
                    else
                    {
                        selReferencia.eliminar = !selReferencia.eliminar;
                    }
                }
                     
            }
            catch (Exception ex) { throw ex; }
        }

        public void Agregar(object objGrid) 
        {
            try 
            {
                DataGrid grid = (DataGrid)objGrid;
                VMreferenciaColeccion refCol= new VMreferenciaColeccion();
                lisReferencias.Add(refCol);
                selReferencia = refCol;
                grid.ScrollIntoView(grid.Items[lisReferencias.Count-1]);
        
            }
            catch (Exception ex) { msn.texto = ex.Message; msn.tipo = false;}
        }

        VMreferenciaColeccion selRef;
        public void BuscarReferencia() 
        {
            try 
            {
                if (selReferencia == null) return;
                if (selReferencia.agregar == false) return;
                    selRef = selReferencia;
                buscarReferencia.IsOpen = true;
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        void OnBuscarReferenciaPropertyChanged(object sender, PropertyChangedEventArgs e)
        {
            try 
            {
                if (e.PropertyName == "IsOpen")
                {
                    if (!buscarReferencia.IsOpen)
                    {
                        selReferencia = selRef;
                        bool aux = true;
                        foreach (string x in buscarReferencia.listaProducto)
                        {
                            if (aux)
                            {
                                selReferencia.refCol = x;
                                selReferencia.codCol = codigo;
                                aux = false;
                            }
                            else
                            {
                                lisReferencias.Add(new VMreferenciaColeccion { refCol = x,codCol=codigo ,agregar = true });
                            }
                        }
                    }

                }
            }
            catch (Exception ex) { throw ex; }
        }

        private void GuardarCambios() 
        {
            try
            {
                List<CLSREFCLCP> crear = new List<CLSREFCLCP>();
                crear = (from cust in lisReferencias where cust.agregar.Equals(true) select cust.getRefColeccion()).ToList();
                List<CLSREFCLCP> eliminar = new List<CLSREFCLCP>();
                eliminar = (from cust in lisReferencias where cust.eliminar.Equals(true) select cust.getRefColeccion()).ToList();
                if (_rep.guardarColeccion(_coleccion, crear, eliminar))
                {
                    consultarColeccion();
                    consultarColecciones();
                  
                    msn.texto = "Los cambios fueron guardados correctamente.";
                    msn.tipo = true;

                }
                else {
                    msn.texto = "Los cambios no puden ser guardados.";
                    msn.tipo = false;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        private void EliminarColeccion()
        {
            try
            {
                if (_rep.EliminarColeccion(_coleccion))
                {
                    consultarColeccion();
                    consultarColecciones();
                    msn.texto = "La coleccion fue eliminada correctamente.";
                    msn.tipo = true;
                    codigo = "";
                }
                else
                {
                    msn.texto = "La coleccion no se puede eliminar.";
                    msn.tipo = false;
                }
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }

        }

        private void Salir(object _ventana) 
        {
            try 
            { 
                ((Window)_ventana).Close(); 
            }
            catch (Exception ex) { MessageBox.Show(ex.Message); }
        }

        #endregion

    }

    public class VMreferenciaColeccion:ViewModelBase
    {

        #region fields

        private CLSREFCLCP _refcol = new CLSREFCLCP();

        #endregion

        #region constructor

        public VMreferenciaColeccion(CLSREFCLCP refcol)
        {
            try {
                _refcol = refcol;
            }
            catch (Exception ex) { throw ex; }
        }

        public VMreferenciaColeccion()
        {
            try
            {
                agregar = true;
            }
            catch (Exception ex) { throw ex; }
        }

        #endregion

        #region public interface

        
        public string refCol {
            get { return referencia + codColor; }
            set { string aux = value;
            if (aux.Length == 6)
            {
                referencia = aux.Substring(0, 4);
                codColor = aux.Substring(4, 2);
                base.OnPropertyChanged("refCol");
            }
          
            }
        }

        public string referencia {
            get { return _refcol.CODREF_RXC; }
            set { _refcol.CODREF_RXC = value;
            consultarNombreRef();
            base.OnPropertyChanged("referencia");
            }
        }

        public string nombre {
            get { return _refcol.referencia.NOMREF_REF; }
            set { _refcol.referencia.NOMREF_REF = value;
            base.OnPropertyChanged("nombre");
            }
        
        }

        public string color {
            get { return _refcol.referencia.infocol.NOMCOL_COL; }
            set { _refcol.referencia.infocol.NOMCOL_COL = value;
            base.OnPropertyChanged("color");
            }
        }

        public string codColor
        {
            get { return _refcol.CODCOL_RXC; }
            set
            {
                _refcol.CODCOL_RXC = value;
                consultarNombreCol();
                base.OnPropertyChanged("codColor");
            }
        }


        public string codCol
        {
            get { return _refcol.CODCLC_RXC; }
            set
            {
                _refcol.CODCLC_RXC = value;
                base.OnPropertyChanged("codCol");
            }
        }


        
        private bool _eliminar = false;
        public bool eliminar {
            get { return _eliminar; }
            set { _eliminar = value;
            base.OnPropertyChanged("eliminar");
            }
        }

        private bool _agregar = false;
        public bool agregar
        {
            get { return _agregar; }
            set
            {
                _agregar = value;
                base.OnPropertyChanged("agregar");
            }
        }

        private bool _actualizar = false;
        public bool actualizar
        {
            get { return _actualizar; }
            set
            {
                _actualizar = value;
                base.OnPropertyChanged("actualizar");
            }
        }
   
        #endregion  

        #region methods
        private void consultarNombreRef() {
            try {
            
                CLSMAEREF refe=new CLSMAEREF{CODREF_REF=referencia};
                refe.Consultar();
                nombre = refe.NOMREF_REF;
            }
            catch (Exception ex) { throw ex; }
        
        }

        private void consultarNombreCol() {
            try {
                CLSMAECOL col = new CLSMAECOL {CODCOL_COL=codColor };
                col.Consultar();
                color = col.NOMCOL_COL;
            }
            catch (Exception ex) { throw ex; }
        
        }

        public CLSREFCLCP getRefColeccion() {
            return _refcol;
        }
        #endregion

    }



}
